home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu086.dms / pu086.adf / clibs / crt0.asm < prev    next >
Assembly Source File  |  1990-12-04  |  5KB  |  226 lines

  1. ;  (c) 1990 S.Hawtin.
  2. ;  Permission is granted to copy this file provided
  3. ;   1) It is not used for commercial gain
  4. ;   2) This notice is included in all copies
  5. ;   3) Altered copies are marked as such
  6. ;
  7. ;  No liability is accepted for the contents of the file.
  8. ;
  9. ;
  10. ; C startup file for the Amiga.
  11. ;
  12. ; This file must be linked as the first object module in any C program.
  13. ; it loads all the needed libraries, then calls __main to set up the
  14. ; command line parameters and the default FILE * structures.
  15. ;
  16. ;  CHANGES
  17. ;
  18. ;    12 Dec 1989    Created as simple startup        S.Hawtin
  19. ;    17 Feb 1990    Added workbench drivers            S.Hawtin
  20. ;    13 Apr 1990    Changed AmigaDOS library interface    S.Hawtin
  21. ;     5 Aug 1990    Various optimisations from M.Combs    S.Hawtin
  22. ;
  23. ;        Macro definitions
  24. ;
  25.     INCLUDE    clibdefs.i
  26. ;
  27. ;
  28. ;
  29.     section ONE,CODE
  30. ;
  31. ;
  32. ;
  33.     XREF    __main
  34.     XREF    initmem
  35.     XREF    clearmem
  36.     XREF    fp_open
  37.     XREF    fp_close
  38.     XREF    __WBConsole
  39.     XREF    __AmiLibArray
  40.     XREF    finalLib
  41.  
  42. ;
  43. ;        Define entry point
  44. ;
  45.        XDEF    start
  46. start:
  47.     move.l    sp,StkPtr    ; Save stack pointer for EXIT
  48.     move.l    d0,__cmndlen    ; Save length of command
  49.     move.l    a0,__cmndstr    ; Save command buffer
  50. ;
  51. ;        Open DOS library
  52. ;
  53.     move.l    #dosname,a1
  54.     clr       d0
  55.     call    exec,OpenLibrary
  56.     move.l    d0,dosLib
  57.     beq    error_exit
  58. ;
  59. ;    Set up malloc lists
  60. ;
  61.     jsr    initmem
  62.     tst.l    d0
  63.     beq    error_exit
  64. ;
  65. ;    Open the floating point library.  The mathtrans library is only 
  66. ;       opened when it is required.
  67. ;
  68.     jsr    fp_open
  69. ;
  70. ;    Were we started from the workbench ?
  71. ;
  72.     move.l    #0,a1        ; Find this tasks structure
  73.     call    exec,FindTask
  74.     move.l    d0,__Task
  75.     move.l    d0,a2
  76.     tst.l    PROC.CLI(a2)    ; Is it a CLI task?
  77.     beq.s    WBtask
  78. ;
  79. ;        Find standard file handles
  80. ;
  81. CLItask:
  82. ; This section has been removed because I cannot seem to find the
  83. ; command name.
  84. ;    ; Get the command name here
  85. ;    move.l    PROC.CLI(a2),a0
  86. ;    add.l    a0,a0
  87. ;    add.l    a0,a0        ; Now points to CLI struct
  88. ;    move.l    CLI.COMMAND(a0),a1
  89. ;    add.l    a0,a0
  90. ;    add.l    a0,a0        ; Now points to command name
  91. ;    moveq.l    #0,d0
  92. ;    move.b    (a0)+,d0
  93. ;    move.l    d0,__cmndnlen
  94. ;    move.l    (a0),__cmndnam
  95.     ; Now get the input and output handles
  96.     move.l    #0,__fromWB    ; Not from workbench
  97.     call    dos,Input
  98.     move.l    d0,__stdin
  99.     beq    error_exit
  100.     call    dos,Output
  101.     move.l    d0,__stdout
  102.     beq    error_exit
  103.     bra    NowRun
  104. ;
  105. ;    Called from the workbench
  106. ;
  107. WBtask:
  108.     move.l    #-1,__fromWB    ; from Workbench
  109.     lea    PROC.MSGPORT(a2),a0
  110.     call    exec,WaitPort    ; wait for the workbench message
  111.     lea    PROC.MSGPORT(a2),a0
  112.     call    exec,GetMsg
  113.     move.l    d0,__WBmsg
  114.     ; Find the directory the program is in
  115. ; This lot is dealt with in the cstartup file
  116. ;    move.l    d0,a2
  117. ;    move.l    SM.ARGLIST(a2),d0
  118. ;    beq.s    noDir
  119. ;    move.l    d0,a0
  120. ;    move.l    WA.LOCK(a0),d1
  121. ;    call    dos,CurrentDir
  122. ;noDir:
  123.     move.l    __WBConsole,d1    ; Default console
  124.     move.l    #MODE_NEWFILE,d2
  125.     call    dos,Open
  126.     move.l    d0,__stdin    ; Console becomes default
  127.     move.l    d0,__stdout
  128.     beq    error_exit
  129.     ; Convert open console into 68000 address
  130.     lsl.l    #2,d0
  131.     move.l    d0,a0
  132.     move.l    __Task,a2    ; Link the console to the task
  133.     move.l    FH.TYPE(a0),PROC.CONSOLE(a2)
  134. ;
  135. ;    Call main C entry point via Cstartup
  136. ;
  137. NowRun:
  138.     jsr    __main
  139. ;
  140. ;    If _main returns fall through to a normal (0) exit
  141. ;
  142.     move.l    #0,a0
  143.  
  144. a0_exit:
  145.     move.l    a0,-(sp)        ; Hide the return code
  146.     jsr    clearmem        ; Tidy up memory
  147.  
  148.     tst.l    __fromWB
  149.     beq.s    exit1
  150.     move.l    __stdout,d1        ; If stdout is still open, close it
  151.     beq.s    exit1
  152.     call    dos,Close
  153. exit1:
  154.     tst.l    __WBmsg
  155.     beq.s    exit2
  156.     call    exec,Forbid        ; Must do this before ReplyMsg
  157.     move.l    __WBmsg,a1        ; or risk vanishing
  158.     call    exec,ReplyMsg
  159. exit2:
  160.     ; Close any libraries that have been left open
  161.     move.l    #finalLib,a2
  162. exit3:
  163.     subq.l    #4,a2
  164.     move.l    (a2),a1
  165.     cmp.l    #0,a1
  166.     beq.s    exit4
  167.     call    exec,CloseLibrary
  168. exit4:
  169.     cmp.l    #__AmiLibArray,a2
  170.     bne    exit3
  171.     move.l    (sp)+,d0        ; Return code stored in d0
  172.     rts
  173. ;
  174. ;     Close with an error, we have no clue as to which one
  175. ;
  176. error_exit:
  177.     move.l    #100,a0            ; 100 seems like a nice error code
  178.     bra    a0_exit
  179.  
  180. ;
  181. ;    void _exit(long num);
  182. ;
  183.     xdef    __exit
  184. __exit:
  185.     move.l    4(sp),a0    ; Put the arg into a0
  186.     move.l    StkPtr,sp    ; Restore the stack
  187.     bra    a0_exit        ; and exit
  188.  
  189. ;
  190.     section  TWO,data
  191. ;
  192. ;    DOS Library name
  193. ;
  194. dosname dc.b    'dos.library',0
  195. ;
  196.          section    THREE,bss
  197. ;
  198. ;
  199. ;
  200. CharBuff ds.b      1
  201.      ds.b     1
  202. ;
  203. ;
  204. ;
  205. StkPtr     ds.l      1 
  206. ;
  207. ;
  208. ;
  209.     xdef    __cmndlen,__cmndstr,__cmndnam,__cmndnlen
  210. __cmndnlen ds.l      1     ;Command name length
  211. __cmndnam ds.l      1    ;Command name
  212. __cmndlen ds.l      1    ;Command line length
  213. __cmndstr ds.l      1    ;Command line buffer
  214.  
  215.     xdef    __stdin,__stdout
  216. __stdin  ds.l     1     ;input file handle
  217. __stdout ds.l     1     ;output file handle
  218. ;
  219. ;
  220.     xdef    __fromWB,__Task,__WBmsg
  221. __fromWB ds.l    1    ; Zero if called from CLI
  222. __Task   ds.l    1    ; This tasks structure
  223. __WBmsg     ds.l    1    ; message from WB
  224.  
  225.     END
  226.